package veterinaria.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import veterinaria.excepcion.DAOExcepcion;
import veterinaria.modelo.Raza;
import veterinaria.modelo.Especie;
import veterinaria.util.ConexionBD;

public class RazaDAO extends BaseDAO {

    public Collection<Raza> buscarPorNombre(String pNom) throws DAOExcepcion {
        String cSql="Select RazCodigo,RazNombre,MEspecie_EspCodigo,EspNombre From MRaza a, MEspecie b Where a.MEspecie_EspCodigo=b.EspCodigo And RazNombre Like ? And a.RazFlg<>'E' Order By 3,1,2";       
        Collection<Raza> lisDoc=new ArrayList<Raza>();
        Connection cCon=null;
        PreparedStatement cCom=null;
        ResultSet cRst=null;
        try {
            cCon=ConexionBD.obtenerConexion();
            cCom=cCon.prepareStatement(cSql);
            cCom.setString(1, "%" + pNom + "%");
            cRst=cCom.executeQuery();
            while (cRst.next()) {
                Raza cReg=new Raza();
                Especie cEsp=new Especie();
                cEsp.setEspCodigo(cRst.getInt("MEspecie_EspCodigo"));
                cEsp.setEspNombre(cRst.getString("EspNombre"));
                cReg.setEspecie(cEsp);
                cReg.setRazCodigo(cRst.getInt("RazCodigo"));
                cReg.setRazNombre(cRst.getString("RazNombre"));
                lisDoc.add(cReg);
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
            
        } finally {
            this.cerrarResultSet(cRst);
            this.cerrarStatement(cCom);
            this.cerrarConexion(cCon);
        }
        System.out.println(lisDoc.size());
        return lisDoc;
    }

    public Raza insertar(Raza pReg) throws DAOExcepcion {
        String cSql = "Insert Into MRaza(RazNombre,RazFlg,MEspecie_EspCodigo) Values (?,?,?)";
        Connection cCon = null;
        PreparedStatement cCom = null;
        ResultSet cRst = null;
        try {
            cCon = ConexionBD.obtenerConexion();
            cCom = cCon.prepareStatement(cSql);
            cCom.setString(1, pReg.getRazNombre());
            cCom.setString(2, "A");
            cCom.setInt(3, pReg.getEspecie().getEspCodigo());           
            int nroErr = cCom.executeUpdate();
            if (nroErr != 1) {
                throw new SQLException("No se pudo insertar");
            }
            int newCod = 0;
            cSql="Select Last_Insert_id()";
            cCom=cCon.prepareStatement(cSql);
            cRst=cCom.executeQuery();
            if (cRst.next()) {
                newCod=cRst.getInt(1);
            }
            pReg.setRazCodigo(newCod);

        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(cRst);
            this.cerrarStatement(cCom);
            this.cerrarConexion(cCon);
        }
        return pReg;
    }

    public Raza obtener(int pCod) throws DAOExcepcion {
        Raza cReg = new Raza();
        Connection cCon = null;
        PreparedStatement cCom = null;
        ResultSet cRst = null;
        try {
            String query = "Select RazCodigo, RazNombre, MEspecie_EspCodigo From MRaza Where RazCodigo=? And RazFlg<>'E'";
            cCon=ConexionBD.obtenerConexion();
            cCom=cCon.prepareStatement(query);
            cCom.setInt(1, pCod);
            cRst=cCom.executeQuery();
            if (cRst.next()) {
                cReg.setRazCodigo(cRst.getInt(1));
                cReg.setRazNombre(cRst.getString(2));
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(cRst);
            this.cerrarStatement(cCom);
            this.cerrarConexion(cCon);
        }
        return cReg;
    }

    public Raza eliminar(Raza pReg) throws DAOExcepcion {
        String cSql="UpDate MRaza Set RazFlg=? Where RazCodigo=? And RazFlg<>'E'";
        Connection cCon=null;
        PreparedStatement cCom=null;
        try {
            cCon=ConexionBD.obtenerConexion();
            cCom=cCon.prepareStatement(cSql);
            cCom.setString(1, "E");
            cCom.setInt(2, pReg.getRazCodigo());            
            int i = cCom.executeUpdate();
            if (i != 1) {
                throw new SQLException("No se pudo eliminar");
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarStatement(cCom);
            this.cerrarConexion(cCon);
        }
        return pReg;        
    }

    public Raza actualizar(Raza pReg) throws DAOExcepcion {
        String cSql="UpDate MRaza Set RazNombre=?, RazFlg=?,MEspecie_EspCodigo=? Where RazCodigo=? And RazFlg<>'E'";
        Connection cCon=null;
        PreparedStatement cCom=null;
        try {
            cCon=ConexionBD.obtenerConexion();
            cCom=cCon.prepareStatement(cSql);
            cCom.setString(1, pReg.getRazNombre());
            cCom.setString(2, "M");
            cCom.setInt(3, pReg.getEspecie().getEspCodigo());
            cCom.setInt(4, pReg.getRazCodigo());            
            int i = cCom.executeUpdate();
            if (i != 1) {
                throw new SQLException("No se pudo actualizar");
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarStatement(cCom);
            this.cerrarConexion(cCon);
        }
        return pReg;
    }

    public Collection<Raza> listar() throws DAOExcepcion {
        Collection<Raza> c = new ArrayList<Raza>();
        Connection cCon=null;
        PreparedStatement cCom=null;
        ResultSet cRst=null;
        try {
            cCon = ConexionBD.obtenerConexion();
            String cSql="Select RazCodigo,RazNombre,MEspecie_EspCodigo,EspNombre From MRaza a, MEspecie b Where a.MEspecie_EspCodigo=b.EspCodigo And a.RazFlg<>'E' Order By 3,1,2";
            cCom=cCon.prepareStatement(cSql);
            cRst=cCom.executeQuery();
            while (cRst.next()) {
                Raza cReg=new Raza();
                Especie cEsp=new Especie();
                cEsp.setEspCodigo(cRst.getInt("MEspecie_EspCodigo"));
                cEsp.setEspNombre(cRst.getString("EspNombre"));
                cReg.setEspecie(cEsp);
                cReg.setRazCodigo(cRst.getInt("RazCodigo"));
                cReg.setRazNombre(cRst.getString("RazNombre"));
                c.add(cReg);
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(cRst);
            this.cerrarStatement(cCom);
            this.cerrarConexion(cCon);
        }
        return c;
    }
}
